/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* removeElements(struct ListNode* head, int val){

    while(head!=NULL && head->val==val){ //若链表的首结点存储的数据为目标值，可以直接先删除此首节点
        struct ListNode *temp=head;
        head = head->next;
        free(temp);
    }
        if(head == NULL){ //以防head为NULL时，无法访问‘head->next’导致空指针异常
        return NULL;
    }
    struct ListNode *pre,*p,*x=head->next,*prex=head; //采用双指针法解决，因为在单链表里删除一个节点需要找到它的前驱节点，pre表示p的前驱节点
    while(x!=NULL){
        if(x->val == val){ //遍历链表找到目标值，写入删除数据元素的代码，需要注意的是：在释放目标节点后，需要更新pre与x的值，以防下次循环出错
            pre = prex;
            p = x;
            pre->next = p->next;
            free(p);
            x = pre->next;
        }
        else{ //没找到目标值，继续遍历链表，直到x==NULL
            prex = x;
            x = x->next;
        }
    }
    return head;
}